//引入fs模块
import fs from "fs"
//引入fileURLToPath模块用于解决路径以file开头的问题
import { fileURLToPath } from "url"

// 定义一个函数 getControllers，用于获取所有控制器文件的路径
export const getControllers = function(){
    // 使用 import.meta.url 获取当前模块的 URL
    // 然后构造一个指向当前模块所在目录的父目录中 "controllers" 子目录的 URL
        let controllersUrl= new URL('../controllers',import.meta.url).href
    
    // 将 URL 转换为文件系统路径
        let filePath=fileURLToPath(controllersUrl)
    
    // 同步读取目录内容，获取所有文件名
        let files=fs.readdirSync(filePath)
    
    // 筛选出所有以 "Controllers.js" 结尾的文件
        let controllersFiles=files.filter(item=>item.endsWith('Controllers.js'))
    
    // 将筛选出的文件名转换为完整的文件路径
        let controllersPath=controllersFiles.map(item=>`${controllersUrl}/${item}`)
    
    // 返回包含所有控制器文件路径的数组
        return controllersPath
}

//自动注册路由:作用：将每个控制器文件中定义的路由注册到 Express 应用中
// 定义一个函数 regControllers，用于注册控制器到路由
export const regControllers=function(router,controllersFiles){
    // 遍历 controllersFiles 数组中的每个控制器文件路径
        controllersFiles.forEach(async item => {
             // 动态导入每个控制器模块
            let arr= await import(item)
                 // 遍历控制器模块默认导出的路由数组
                arr.default.forEach(obj => {
                // 根据路由对象中的 method 属性注册对应的 HTTP 方法

                // 如果方法是 'get'，则使用 router.get 注册路由
                if(obj.method==='get'){
                    router.get(obj.url,obj.fn)
                }
                // 如果方法是 'post'，则使用 router.post 注册路由
                if(obj.method==='post'){
                    router.post(obj.url,obj.fn)
                }
                // 如果方法是 'put'，则使用 router.put 注册路由
                if(obj.method==='put'){
                    router.put(obj.url,obj.fn)
                }
                // 如果方法是 'del'（通常用于删除操作），则使用 router.delete 注册路由
                if(obj.method==='del'){
                    router.delete(obj.url,obj.fn)
                }

            });
              
        });
         
}

    